﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Windows.Forms;

using System.Data.Sql;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Text.RegularExpressions;

using UricaoWeb.LogicaDeNegocios.Cargos;
using UricaoWeb.LogicaDeNegocios.Seguridad_y_Roles;
using UricaoWeb.LogicaDeNegocios.Empleados;



namespace UricaoWeb.Presentacion
{
    public partial class API_agregar_empleado : API_Seguridad_Principal
    {

        #region Atributos

        public static int _fkHotel = 1;
        private EmpleadoLogico _empleado;
        private LogicaNegocioEmpleado _controlador = new LogicaNegocioEmpleado();
        UricaoWeb.LogicaDeNegocios.Seguridad_y_Roles.Logica_Usuario _seg = new UricaoWeb.LogicaDeNegocios.Seguridad_y_Roles.Logica_Usuario();
        Cargo _cargoEmpleado = new Cargo();
        private List<Cargo> _listaCargos = new List<Cargo>();
        private List<string> _listaNombreCargos = new List<string>();
        private string _mensaje = "";
        private int _nmCuenta;
        #endregion

        #region Metodos

        /// <summary>
        /// Método Es el constructor por defecto de la clase que obtiene los cargos
        /// </summary>


        protected void Regresar(object sender, EventArgs e)
        {
            Response.Redirect("API_Empleado_Consultar.aspx");
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["user"] != null)
            {
                Logica_Usuario usuario = (Logica_Usuario)Session["user"];
                _fkHotel = Convert.ToInt32(usuario.FkHotel);
                var master = Master as MasterPage;
                if (master != null)
                {
                    master.actualizar_label();
                }
                base.validar_usuario();
                _listaCargos = _cargoEmpleado.ConsultarCargosGeneral().ToList<Cargo>();
                //_listaNombreCargos = LlenarCargos(_listaNombreCargos, _listaCargos);
                if (!IsPostBack)
                {
                    _listaNombreCargos = LlenarCargos(_listaNombreCargos, _listaCargos);
                    CBlistaCargos.DataSource = _listaNombreCargos;
                    CBlistaCargos.DataBind();
                }
            }
            else
            {
                Server.Transfer("API_Seguridad_Login_.aspx", false);
            }
        }

        /// <summary>
        ///Metodo que valida campos vacios.
        /// </summary>
        /// <returns>Retorna true si no hay campos vacios</returns>

        public bool ValidarCamposVacios(string nombre, string apellido, string correo, string fecha, string direccion)
        {
            if (nombre.Equals("") || apellido.Equals("") || correo.Equals("") || fecha.Equals("") || direccion.Equals(""))
            {
                return false;
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        ///Metodo que verifica los caracteres permitidos en los campo nombre y apellido del empleado, los cuales son:
        ///letra y espacios en blancos.
        /// </summary>
        /// <returns>Retorna true si cumple con los caracteres permitidos, en caso contrario retorna false</returns>
        private bool VerificarCaracteres()
        {
            string expresionesRegulares = "^[A-Z a-z]*$";
            Regex rgTexto = new Regex(expresionesRegulares);

            if (rgTexto.IsMatch(nombreTxtBox.Text) && (rgTexto.IsMatch(apellidoTxtBox.Text)))
                return true;
            else
                return false;
        }

        /// <summary>
        /// Método llena una lista con los nombres de los cargos
        /// Parámetros: 
        /// List<string> listaNombreCargos:
        /// Retorno: 
        /// List<string>: Lista con los nombres de los cargos
        /// </summary>

        private List<string> LlenarCargos(List<string> _listaNombreCargos, List<Cargo> _listaCargos)
        {
            _listaNombreCargos.Add("Elija un cargo...");

            foreach (Cargo x in _listaCargos)
            {
                _listaNombreCargos.Add(x._nombre);
            }
            return _listaNombreCargos;
        }

        /// <summary>
        /// Método que obtiene la informacion de los TextBox para insertarlos
        /// Parámetros: 
        /// object sender: Objeto que ha generado el evento
        /// EventArgs e: Contiene los datos del evento
        /// </summary>

        protected void InsertarEmpleado(object sender, EventArgs e)
        {
            _empleado = new EmpleadoLogico();

            if (ValidarCamposVacios(nombreTxtBox.Text, apellidoTxtBox.Text, correoTxtBox.Text, fechaNacTxtBox.Text, direccionTxtBox.Text))
            {
                if (VerificarCaracteres())
                {
                    if (VerificarCorreo())
                    {
                        _empleado = new EmpleadoLogico();
                        if (CBlistaCargos.SelectedIndex != 0)
                            _empleado.Empleado.FkCargo = _cargoEmpleado.ConsultarCargoPorNombre(CBlistaCargos.SelectedItem.Text)._id;
                        else
                            _mensaje = _mensaje + "Cargo ";

                        _empleado.Empleado.NombreEmpleado = nombreTxtBox.Text;
                        _empleado.Empleado.ApellidoEmpleado = apellidoTxtBox.Text;
                        _empleado.Empleado.CorreoEmpleado = correoTxtBox.Text;
                        _empleado.Empleado.FechaNacimientoEmpleado = DateTime.Parse(fechaNacTxtBox.Text);
                        _empleado.Empleado.DireccionEmpleado = direccionTxtBox.Text;
                        _empleado.Empleado.FkHotel = _fkHotel;
                        _empleado.Empleado.EstatusEmpleado = true;

                        _nmCuenta = 0;
                        _nmCuenta = _controlador.VerificarExistenciaNombreApellido(nombreTxtBox.Text, apellidoTxtBox.Text) + 1;
                        string stCuenta = _nmCuenta.ToString();

                        _empleado.Usuario.FkEmpleado = _controlador.maximo();
                        _empleado.Usuario.NombreUsuario = ObtenerCaracteres(nombreTxtBox.Text) + ObtenerCaracteres(apellidoTxtBox.Text) + stCuenta;
                        _empleado.Usuario.ClaveUsuario = UricaoWeb.LogicaDeNegocios.Seguridad_y_Roles.Login.CambiandoContrasena(_controlador.maximo().ToString(), _empleado.Usuario.NombreUsuario);
                        _nmCuenta = 0;

                        if (_controlador.InsertarEmpleado(_empleado) && _controlador.AgregarUsuario(_empleado.Usuario))
                        {
                            string _mensajeExito = "El empleado se ha registrado satisfactoriamente. Su usuario es: " + _empleado.Usuario.NombreUsuario + " y su clave es: " + _empleado.Usuario.ClaveUsuario;
                            string scriptText = "alert('"+_mensajeExito+"'); window.location='" + Request.ApplicationPath + "../Presentacion/API_Empleado_Consultar.aspx';";
                            ScriptManager.RegisterStartupScript(this, this.GetType(), "alertMessage", scriptText, true);
                        }
                        else
                            ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('No se pudo registrar el empleado')", true);
                    }
                    else
                        ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('No se pudo registrar el empleado, el campo correo no cumple el formato')", true);
                }
                else
                    ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('No se pudo registrar el empleado, los campos nombre y apellido solo permiten letras')", true);
            }
            else
                ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alertMessage", "alert('No se pudo registrar el empleado, debe rellenar todos los campos')", true);
        }


        /// <summary>
        /// Método para obtener los primeros 3 caracteres
        /// Parámetros: 
        /// string identificacion: nombre o apellido del empleado
        /// Retorno: 
        /// string caracteres: las 3 primeros caracteres
        /// </summary>

        private string ObtenerCaracteres(string identificacion)
        {
            string caracteres = identificacion.Substring(0, 3);
            return caracteres;
        }


        /// <summary>
        /// Metodo que verifica sintaxticamente el correo del empleado.
        /// Retorno:
        /// bool true: Si cumple con los caracteres permitidos, false: No cumple con los caracteres permitidos 
        /// </summary>

        private bool VerificarCorreo()
        {
            string expresionesRegulares = "^([0-9a-zA-Z]([-.\\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\\w]*[0-9a-zA-Z]\\.)+[a-zA-Z]{2,9})$";
            if ((Regex.IsMatch(correoTxtBox.Text, expresionesRegulares)) && (_controlador.ValidarCorreoNuevo(correoTxtBox.Text)))
                return true;
            return false;
        }

        /// <summary>
        /// Método para ejecutar un script de alerta para verificar campos
        /// Parámetros: 
        /// string mensaje: campos a verificar
        /// </summary>

        protected void MostrarMensaje(string _mensaje)
        {
            Page.ClientScript.RegisterStartupScript(this.GetType(), "alert" + UniqueID, "alert('" + _mensaje + "');", true);
        }
    }
        #endregion
}